<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一、this  : 如果是函数里this 主要看调用方式 ；
        // 一、全局this  --->window
        // console.log(this);  
        // 二、函数里的this
            // 1.直接调用 指向 window 
            // function test(){
            //     console.log(this);
            // }
            // test();
            //2.通过事件触发 ，会指向 事件源 
            // document.onclick = function(){
            //     console.log(this);
            // }
        // 三 在对象里
        // let obj = {
        //     name:"张三",
        //     fn(){
        //         console.log(this);
        //     }
        // }
        // 和调用有关系 
        // 1.直接通过对象调用方法 this--->指向 对象本身
        // obj.fn();
        // 2 .通过变量接收 
        // let myfn = obj.fn;
        // myfn();

        // 四、定时器里的this 是 windwow
        // setInterval(function(){
        //     console.log(this);

        // }, 1000);
        // setTimeout(function(){
        //     console.log(this);
        // }, 1000);

        // 五、混一起了:处理方式 是 在外层通过一个变量把外层的this保存起来 ，里面在使用
        // 情况一
        // document.onclick = function(){


        //     setTimeout(function(){
        //         console.log(this)
        //     }, 1000);
        // }
        // 情况二
            // var arr = [1,2,3];
            // document.onclick = function(){
            //     // this
            //     let that = this;
            //     // let _this = this;
            //     arr.forEach(function(item){
            //         // this
            //         console.log(that,item,this);
            //     })
            // }


        //二、 强行改变this指向；call aplly bind   : ES5


        function test(a,b,c){
            console.log(this,a,b,c);
        }
        // 普通调用函数
        // test(1,2,3);
        // call：第一个参数是要改变的this指向；
        // 后面参数对应普通调用时候的参数；
        let obj = {
            name:"李四"
        }
        // 1.通过call 改变this指向调用；
        // test.call(obj,1,2,3);
        // 2.通过apply改变this指向调用 
        // 第一个参数是要改变的this指向
        // 第二个参数是数组，数组里放传递的参数；
        // test.apply(obj,[1,2,3]);
        // 3.通过bind来改变this指向 然后执行函数  add(1)(2)(3)
        // 注意 bind 需要执行2次；第一次是改变this执行 第二次 是执行 然后传参数
       var fn =  test.bind(obj)  //先改变this指向
       fn(1,2,3);  //在执行函数






    </script>
</body>
</html>